﻿using System;
using System.Windows.Forms;
using AutomatedDecisionMaking.Class;
using AutomatedDecisionMaking.Class.Algorithms;

namespace AutomatedDecisionMaking.GUI.LaplaceWindow
{
    public partial class FrmLaplace : Form
    {
        #region Pola prywatne, konstruktor, podstawowa własności graficzne okna
        private readonly LaplaceAlgorithm _mAlgorithm;  /// Algorytm realizujący podejmowanie decyzji
        
        ///<summary>
        /// Konstruktor domyślny okna laplace'a
        /// </summary>
        /// <param name="decisionMatrix">Macierz decyzji</param>
        public FrmLaplace(DecisionMatrix decisionMatrix)
        {
            InitializeComponent();
            _mAlgorithm = new LaplaceAlgorithm(decisionMatrix);
            ShowPanel1();
        }

        /// <summary>
        /// Wyświetlenie Panelu nr. 1
        /// </summary>
        private void ShowPanel1()
        {
            Panel1.Visible = true;
            Panel2.Visible = false;
        }

        /// <summary>
        /// Wyświetlenie Panelu nr. 2
        /// </summary>
        private void ShowPanel2()
        {
            Panel1.Visible = false;
            Panel2.Visible = true;
        }

        /// <summary>
        /// Metoda przygotowująca podstawowy wygkląd okna.
        /// </summary>
        /// <param name="sender">Obiekt generujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie</param>
        private void FrmLaplace_Load(object sender, EventArgs e)
        {
            _mAlgorithm.CalculateSolution();
            for (int i = 0; i < _mAlgorithm.GetDecisionMatrix().ScenarioList.Count; ++i)
            {
                p1DataGridView_LaplaceWeights.Rows.Add(_mAlgorithm.GetLaplaceWeight());
                p1DataGridView_LaplaceWeights.Rows[i].HeaderCell.Value = "S" + (i + 1);
            }

            var laplaceMaxValues = _mAlgorithm.GetMaxLaplaceValuesStr();
            foreach(var s in laplaceMaxValues)
                p2ListBox_LaplaceVal.Items.Add(s);

            p2TextBox_MaxLaplaceVal.Text = _mAlgorithm.GetMaxLaplaceValue().ToString();

            p2Label_Decision.Text = _mAlgorithm.GetDecision();

        }
        #endregion

        #region Obsługa przycisków nawigacji okna
        /// <summary>
        /// Metoda generująca zdarzenie podczas naciśnięcia przycisku next na panelu 1
        /// </summary>
        /// <param name="sender">Obiekt generujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie</param>
        private void p1ButtonNext_Click(object sender, EventArgs e)
        {
            ShowPanel2();
        }

        /// <summary>
        /// Metoda generująca zdarzenie podczas naciśnięcia przycisku prev na panelu 2
        /// </summary>
        /// <param name="sender">Obiekt generujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie</param>
        private void p2ButtonPrev_Click(object sender, EventArgs e)
        {
            ShowPanel1();
        }

        /// <summary>
        /// Metoda generująca zdarzenie podczas naciśnięcia przycisku begin na panelu 2
        /// </summary>
        /// <param name="sender">Obiekt generujący zdarzenie</param>
        /// <param name="e">Rodzaj zdarzenie</param>
        private void p2ButtonBegin_Click(object sender, EventArgs e)
        {
            ShowPanel1();
        }
        #endregion
    }
}
